package org.demo.base.classloader;

/**
 *
 * 静态代码块随着类的加载而加载
 * 静态成员变量随着类的加载初始化
 *
 * 代码块随着对象的创建优先构造器加载
 *
 *
 * 思考：程序由main方法入口执行开始：类的加载、构造方法、父类构造方法、静态代码块、代码块、静态成员变量、非静态成员变量、局部变量，这些执行的
 * 次数、时间、顺序
 *
 *
 *
 *  执行结果：
 *
 *
 *
 *
 *
 *  结论：
 *          类的加载：生成对象，调用静态方法都会先判断类是否已经加载，如果未加载则加载类，只做一次加载，执行静态代码块时肯定是在加载类
 *          静态代码块：类加载时执行静态代码块，只执行一次,只在类的第一次加载时执行，执行静态代码块时肯定是在加载类
 *          代码块：只有在创建对象时才会执行，每个对象的创建都会执行，类的加载不会执行，与构造方法的执行时间一致，但是优先构造方法执行
 *          构造方法：只有在创建对象时才会执行，每个对象的创建都会执行，类的加载不会执行，在代码块执行完成之后执行
 *          静态成员变量：静态成员变量的初始化是随着类的加载而初始化的，优先于静态代码块的执行
 *          非静态成员变量：非静态成员变量随着对象的创建而初始化，优先于代码块执行
 *
 *
 *          类的加载：初始化静态成员变量，执行静态代码块，由于类只做一次加载，这些都只会执行一次
 *
 *          对象的创建：初始化成员变量，执行代码块，，执行构造方法，对象的每次创建都会执行这些
 *
 *
 *
 *
 */
public class Test {

    public Test(){
        System.out.println("Test 构造方法执行。。。。");
    }


    {
        System.out.println("Test 非静态代码块的执行。。。。");
    }


    static {
        System.out.println("Test 静态代码块的执行。。。。");
    }
    public static void main(String[] args) throws ClassNotFoundException {
//        System.out.println(""+System.getProperty("java.ext.dirs"));
//        System.out.println("类加载器："+ClassLoader.getSystemClassLoader());
        System.out.println("----------------------------");
        Class.forName(Cat.class.getName());
        System.out.println("----------------------------");
        Class.forName(Cat.class.getName());
        System.out.println("----------------------------");
        Cat.eat();
        System.out.println("----------------------------");
        Cat cat1 = new Cat();
        System.out.println("----------------------------");
        Cat cat2 = new Cat();
        System.out.println("----------------------------");


    }
}
